﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace iNet.Media.Imaging
{
	/// <summary>
	/// 影像媒體介面。
	/// </summary>
	public interface IImage : IMedia
	{
		/// <summary>
		/// 取得原始影像格式。
		/// </summary>
		IMediaFormat RawFormat { get; }
		/// <summary>
		/// 取得表示此影像的 System.Windows.Media.ImageSource 物件。
		/// </summary>
		/// <returns>System.Windows.Media.ImageSource 物件。</returns>
		ImageSource ToImageSource();
	}
	/// <summary>
	/// 點陣圖影像媒體介面。
	/// </summary>
	public interface IBitmapImage : IImage
	{
		/// <summary>
		/// 複製指定矩形範圍中的像素資料。
		/// </summary>
		/// <param name="rect">指定的矩形範圍，Int32Rect.Empty 表示整個點陣圖。</param>
		/// <param name="pixelFormat">指定的像素格式。</param>
		/// <param name="palette">指定像素格式所需的調色盤。</param>
		/// <param name="buffer">提供像素資料存放的緩衝區指標。</param>
		/// <param name="bufferSize">緩衝區的位元組大小。</param>
		/// <param name="stride">掃描線的位元組大小。</param>
		void CopyPixels(Int32Rect rect, PixelFormat pixelFormat, BitmapPalette palette, IntPtr buffer, int bufferSize, int stride);
		/// <summary>
		/// 取得水平解析度 (DPI)。
		/// </summary>
		double DpiX { get; }
		/// <summary>
		/// 取得垂直解析度 (DPI)。
		/// </summary>
		double DpiY { get; }
		/// <summary>
		/// 取得值以確認是否擁有可直接存取的像素資料緩衝區。
		/// </summary>
		bool HasDirectPixelBuffer { get; }
		/// <summary>
		/// 鎖定像素資料緩衝區以避免緩衝區記憶體被釋放，直到呼叫 UnlockPixelBuffer 方法為止。
		/// </summary>
		void LockPixelBuffer();
		/// <summary>
		/// 取得調色盤。
		/// </summary>
		BitmapPalette Palette { get; }
		/// <summary>
		/// 取得像素資料緩衝區的起始記憶體位址。
		/// </summary>
		IntPtr PixelBuffer { get; }
		/// <summary>
		/// 取得像素資料緩衝區的掃描線寬度，或稱為步距，單位為位元組。。
		/// </summary>
		int PixelBufferStride { get; }
		/// <summary>
		/// 取得點陣圖的像素格式。
		/// </summary>
		PixelFormat PixelFormat { get; }
		/// <summary>
		/// 取得影像的像素高度。
		/// </summary>
		int PixelHeight { get; }
		/// <summary>
		/// 取得影像的像素寬度。
		/// </summary>
		int PixelWidth { get; }
		/// <summary>
		/// 解除像素資料緩衝區的鎖定，讓緩衝區記憶體得以正常釋放。
		/// </summary>
		void UnlockPixelBuffer();
		/// <summary>
		/// 將像素資料寫入指定的矩形範圍中。
		/// </summary>
		/// <param name="rect">指定的矩形範圍，Int32Rect.Empty 表示整個點陣圖。</param>
		/// <param name="pixelFormat">寫入的像素格式。</param>
		/// <param name="palette">寫入像素格式所需的調色盤。</param>
		/// <param name="buffer">像素資料的緩衝區指標。</param>
		/// <param name="bufferSize">緩衝區的位元組大小。</param>
		/// <param name="stride">掃描線的位元組大小。</param>
		/// <exception cref="InvalidOperationException">點陣圖為唯讀。</exception>
		void WritePixels(Int32Rect rect, PixelFormat pixelFormat, BitmapPalette palette, IntPtr buffer, int bufferSize, int stride);
	}
	/// <summary>
	/// 包含多張子影像的影像媒體介面。
	/// </summary>
	public interface IMultiImage : IImage
	{
		/// <summary>
		/// 取得子影像集合。
		/// </summary>
		IList<IImage> Images { get; }
	}
}
